package com.nineclock.system.service.impl;

import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.nineclock.common.constant.SMSConstant;
import com.nineclock.common.enums.ResponseEnum;
import com.nineclock.common.exception.NcException;
import com.nineclock.common.sms.AliyunSmsUtils;
import com.nineclock.common.utils.PhoneNumCheckUtils;
import com.nineclock.system.mapper.SysUserMapper;
import com.nineclock.system.pojo.SysUser;
import com.nineclock.system.service.SmsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Random;
import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class SmsServiceImpl implements SmsService {
    @Autowired
   SysUserMapper userMapper;
    @Autowired
    AliyunSmsUtils aliyunSmsUtils;
    @Autowired
    RedisTemplate<String,String> redisTemplate;

    @Override
    public void sendSmsCode(String mobile, String type) {
        //1.健壮性判断
        if(mobile == null || type == null){
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }

        //2.校验手机号是否正确
        if (!PhoneNumCheckUtils.isPhoneLegal(mobile)) {
            throw new NcException(ResponseEnum.INVALID_PHONE_NUMBER);
        }
        //根据手机号查询用户信息
        LambdaQueryWrapper<SysUser> userQw = new LambdaQueryWrapper<>();
        userQw.eq(SysUser::getMobile,mobile);
        //查询用户信息
        SysUser user = userMapper.selectOne(userQw);

        //3.如果是注册 判断手机号是否存在 如果存在提示 已经注册,如果是其他 手机号判断存在否,不存在 提示手机号未注册
        //说明是注册功能,手机号不存在
        if ("2".equals(type)) {


        //说明是注册功能手机号存在
            if (user != null) {
                throw new NcException(ResponseEnum.USER_MOBILE_EMAIL_EXISTS);
            }


        }else {
            //else说明是其他功能 手机号应该存在
            //如果用户不存在则报异常
            if (user==null) {
                throw new NcException(ResponseEnum.USER_NOT_REGISTER);
            }

        }
        //4.生成验证码
        String code = RandomUtil.randomNumbers(6);

        //5.验证码发送给用户
//        Boolean flag = aliyunSmsUtils.sendSMS(mobile, code);
//        if (!flag) {
//            throw new NcException(ResponseEnum.SEND_MESSAGE_ERROR);
//        }

        //6.存储带redis
        String key = getPrefix(type) + mobile;
        redisTemplate.boundValueOps(key).set(code,5, TimeUnit.MINUTES);
        log.info("验证码:"+code);
    }

    /**
     * 获取两个验证码 一个redis中的 一个发出的
     * 校验后,删除redis的验证码
     * @param mobile
     * @param type
     * @param checkcode
     */
    @Override
    public Boolean verify(String mobile, String type, String checkcode) {
        //1.健壮性判断
        if (mobile==null || type==null || checkcode == null) {
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }
        //2.获取redis验证码  manager:change:code:15531016731
        String key =  getPrefix(type) + mobile;
        String redisCode = redisTemplate.boundValueOps(key).get();
        //3.校验验证码
        if (!(redisCode != null && redisCode.equals(checkcode))){
            throw new NcException(ResponseEnum.CODE_IMAGE_ERROR);
        }
        //4.校验后,删除redis中的验证码
        redisTemplate.delete(key);
        return true;

    }

    public String getPrefix(String type){
        switch (type){
            case SMSConstant.SMS_TYPE_LOGIN : return SMSConstant.SMS_LOGIN_KEY_PREFIX;
            case SMSConstant.SMS_TYPE_REGISTER : return SMSConstant.SMS_REGISTER_KEY_PREFIX;
            case SMSConstant.SMS_TYPE_CHANGE_MANAGER : return SMSConstant.SMS_CHANGE_MANAGER_KEY_PREFIX;
            case SMSConstant.SMS_TYPE_RESET_PASSWORD : return SMSConstant.SMS_RESET_KEY_PREFIX;
            default : return null;
        }
    }
}
